package com.cg.service;

import com.cg.dto.ResumeParseResultDTO;
import com.cg.dto.EvaluationReportDTO;
import com.cg.dto.ResumeOptimizationDTO;
import com.cg.dto.AiAnalysisTaskDTO;
import org.springframework.web.multipart.MultipartFile;

import java.util.concurrent.CompletableFuture;

/**
 * 简历分析服务接口
 * 基于LangChain4j Easy RAG和OpenAI大模型实现
 */
public interface ResumeAnalysisService {

    /**
     * 上传并解析PDF简历
     * @param userId 用户ID
     * @param file PDF文件
     * @return 异步任务ID
     */
    CompletableFuture<String> uploadAndParseResume(Long userId, MultipartFile file);

    /**
     * 获取简历解析结果
     * @param resumeId 简历ID
     * @return 解析结果
     */
    ResumeParseResultDTO getResumeParseResult(Long resumeId);

    /**
     * 生成测评报告
     * @param userId 用户ID
     * @param resumeId 简历ID
     * @param targetPositionId 目标岗位ID（可选）
     * @return 异步任务ID
     */
    CompletableFuture<String> generateEvaluationReport(Long userId, Long resumeId, Long targetPositionId);

    /**
     * 获取测评报告
     * @param reportId 报告ID
     * @return 测评报告
     */
    EvaluationReportDTO getEvaluationReport(Long reportId);

    /**
     * 生成简历优化建议
     * @param userId 用户ID
     * @param resumeId 简历ID
     * @param targetPositionId 目标岗位ID（可选）
     * @return 异步任务ID
     */
    CompletableFuture<String> generateOptimizationSuggestions(Long userId, Long resumeId, Long targetPositionId);

    /**
     * 获取简历优化建议
     * @param optimizationId 优化建议ID
     * @return 优化建议
     */
    ResumeOptimizationDTO getOptimizationSuggestions(Long optimizationId);

    /**
     * 获取AI分析任务状态
     * @param taskId 任务ID
     * @return 任务状态
     */
    AiAnalysisTaskDTO getTaskStatus(String taskId);

    /**
     * 使用RAG查询简历相关信息
     * @param resumeId 简历ID
     * @param query 查询问题
     * @return 相关回答
     */
    String queryResumeWithRAG(Long resumeId, String query);

    /**
     * 清理简历解析结果缓存
     * @param resumeId 简历ID
     */
    void clearResumeParseResultCache(Long resumeId);

    /**
     * 获取用户最近一次的简历分析概览（最近上传的简历及其最新测评/优化）
     */
    java.util.Map<String, Object> getLatestAnalysisByUser(Long userId);

    /**
     * 通过简历ID获取分析信息
     * 这个方法可以确保获取到指定简历的完整分析信息
     * @param resumeId 简历ID
     * @return 简历分析信息
     */
    java.util.Map<String, Object> getAnalysisByResumeId(Long resumeId);

    /**
     * 强制刷新用户简历分析缓存
     * 前端可以调用此方法强制刷新缓存
     * @param userId 用户ID
     */
    void refreshUserAnalysisCache(Long userId);

    com.cg.dto.SimilarityReportDTO computeSimilarityReport(Long resumeId, Integer topK, Double threshold);
}
